package com.kuangstudy.service.blacklist;

import com.kuangstudy.constant.RedisConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;


/**
 * @author renyitong
 * @version 1.0.0
 * @createTime 2023年09月18日
 * @Description 用户黑白名单
 */
@Service
@Slf4j
public class BlackUserListService {

    @Autowired
    private RedisTemplate redisTemplate;

    @PostConstruct
    private void initBlackList() {
        log.info("把数据库中的黑名单的用户信息放入到redis中....");
        // 避免服务反复重启造成的多次初始化
        if (!this.redisTemplate.hasKey(RedisConstants.USER_BLACK_LIST_KEY)) {
            // 1：模拟从数据库查询出的黑名单的数据：所有的用户id
            List<Integer> blackList = new ArrayList<>();
            for (int i = 0; i < 100; i++) {
                blackList.add(i + 1);
            }
            // 2: 把黑名单的清单放入到redis的set集合中
            blackList.forEach(userId -> this.redisTemplate.opsForSet().add(RedisConstants.USER_BLACK_LIST_KEY, userId));
        }
    }


    /**
     * 添加用户到黑名单中和数据DB中,比如举报
     *
     * @param userid
     */
    public Long addBlackList(Integer userid) {
        // todo 把用户ID添加到黑名单数据库DB中
        // 同时向黑名单的set中也添加一份
        if (!redisTemplate.opsForSet().isMember(RedisConstants.USER_BLACK_LIST_KEY, userid)) {
            Long result = redisTemplate.opsForSet().add(RedisConstants.USER_BLACK_LIST_KEY, userid);
            return result;
        }
        return 0L;
    }


    /**
     * 判断当前用户是否在黑名单中
     *
     * @param userid
     * @return
     */
    public boolean isBlackList(Integer userid) {
        boolean flag = false;
        try {
            flag = redisTemplate.opsForSet().isMember(RedisConstants.USER_BLACK_LIST_KEY, userid);
        } catch (Exception ex) {
            // 这里出现异常一般指你的redis服务崩溃或者服务器链接超时或者一些不可抗的因素
            log.error("出现异常", ex.getMessage());
            // todo 可以考虑数据库对比一次,去数据库查询
        }
        return flag;
    }


    /**
     * 将用户从黑名单中剔除
     * @param userid
     * @return
     */
    public boolean removeBlackList(Integer userid) {
        boolean flag = false;
        try {
            // 1：移除redis黑名单
            Long remove = this.redisTemplate.opsForSet().remove(RedisConstants.USER_BLACK_LIST_KEY,userid);
            // todo 从数据库中移除该黑名单的信息
            flag = remove > 0;
        } catch (Exception ex) {
            log.error("出现异常", ex.getMessage());
        }
        return flag;
    }
}